论文 Formal verification of floating point trigonometric functions (FMCAD 2000) 的阅读笔记。
Formal verification of floating point trigonometric functions
Outline of the algorithm
对 sin/cos 的计算可以分为两个步骤:
- 对于任意的实数
都可以利用下面的式子把 缩减到 的区间内(range reduction):
- 然后对
进行多项式近似:
HOL floating point theory
论文使用 HOL Light 来进行形式化验证。使用自然数三元组 fmt 来表示浮点数格式,iformat fmt 表示该格式下的实数集合(不考虑上界),round fmt rc x 表示将实数 rc 模式(就近舍入、向偶舍入)舍入到 fmt 格式下的结果,normalizes 表示一个实数是否在某个格式表示的范围内,losing 表示实数在舍入到某个格式时是否发生下溢。
不过为了方便,我会对下面的 HOL theorem 的符号做一些变化。
The (1+ε) property
一次浮点计算的结果等于精确结果再乘上一个相对误差。比如在 IEEE 754 下,舍入可以表示为
在避免下溢和浮点数非平凡的情况下,该定理可以表示为:
|- !(losing fmt rc x) /\ !(precision fmt = 0)
==> exists e. abs(e) <= mu rc / 2 pow (precision fmt - 1) /\
round fmt rc x = x * (1 + e)其中 mu rc 是舍入模式 rc 的舍入误差,precision fmt 是格式 fmt 的有效位数。!(losing fmt rc x) 表示实数 fmt 时不会发生下溢,这个定义相当复杂,可以引入一个充分条件来简化它,即 fmt 下是正规的(不超出最小的表示范围):
|- normalizes fmt x ==> !(losing fmt rc x)
where
normalizes fmt x =
x = 0 \/
2 pow (precision fmt - 1) / 2 pow (ulpscale fmt) <= abs xCancellation theorems
在浮点数格式恰好表示实数的时候,舍入误差是完全精确的,可以表示为:
|- a in iformat fmt ==> round fmt rc a = a
|- !(precision fmt = 0) /\ round fmt rc a = a ==> a in iformat fmt在某些情况下,某些浮点运算可以保持结果精确不会产生舍入误差。论文对两种情况 Sterbenz Lemma 和 TwoSum Lemma 给出了 theorem。
综上所述,在 HOL Light 中对浮点数的定义和某些情况下的性质给出了一些基础定理。
Verification of range reduction
首先对第一步 range reduction 进行验证。考虑:
因为使用浮点数表示无理数
计算
为了保证这个相对误差在能够接受的范围内,我们需要首先研究
Approximating
首先考虑怎么找到一个高精度的
若
在 HOL Light 中,这个定理可以表示为:
|- abs(x) <= inv (2 pow k) /\ ~(x = &0) /\ n > 0
==> abs(arctan x - sum (0..n) (\m. ((- &1) pow m / (&2 * m + &1)) * x pow (2 * m + 1))) <= inv (2 pow (n * k - 1))|- pi / &4 = &6 * arctan (inv (&8)) + &2 * arctan (inv (&57)) + arctan (inv (&239))也可以使用 BBP 级数来得到更高精度的逼近。
Bounding the reduced argument
现在回过头来分析
于是我们关心的是给下面这个量求下界:
于是问题变成了,给定
我们只需要考虑那些
的情形,否则
的
另外,我们只需考虑
所以,对于每个
我们只需要找出最接近
的有理数
其中分母满足
这样,我们就可以通过下式得到
的一个相当不错的下界:
引理:如果有两个分数
并且满足:
那么对于任何分数
这可以在 HOL Light 中表示为:
|- p1 / q1 < x /\ x < p2 / q2 /\ p2 * q1 - p1 * q2 = 1
==> !p q. q <= q1 + q2 ==> abs (p / q - x) >= inv (q1 + q2)可以通过反复计算两个分数的中项来迭代地产生这种有理数对。即对于
可以从 0 和 1 开始迭代,直到达到我们感兴趣的精度(Farey 序列/Stern-Broot树)。
对不同的
Analyzing the reduced argument computation
上面的分析表示,参数
Range reduction 的计算依赖于大量特殊技巧来避免或补偿舍入误差。
Verification of core computation
核心计算实际上就是对前面 range reduction 给出的结果 r+c 进行多项式计算。总体误差主要由三部分组成:
- 多项式近似误差:通过多项式逼近 sin/cos 产生的误差(参数由 Remez 算法确定)
- 多项式截断误差:
(出于平衡算法效率和精度的考量,不会把 c 放进多项式计算) - 实际计算时产生的舍入误差
Bounding the approximation error
对于多项式近似误差,论文的思路是:利用 Taylor 级数把 sin/cos 近似成截断 Taylor 多项式
然后剩下的问题是把
也界到
上述工作在 HOL Light 中被形式化为一个通用的 theorem。
Final correctness theorem
最后的正确性定理可以表示为:
|- x in floats Extended /\ abs(Val x) <= &2 pow 64
==> prac (Extended,rc,fz) (fcos rc fz x) (cos(Val x)) (#0.07341 * ulp(rformat Extended) (cos(Val x)))Conclusion
这篇工作主要讲述了 sin/cos 的近似算法,对算法中的误差给出了详细分析,并在 HOL Light 中进行了形式化验证。